//
//  ViewController.m
//  UISearchController
//
//  Created by LZXuan on 15-6-5.
//  Copyright (c) 2015年 轩哥. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UISearchControllerDelegate,UISearchResultsUpdating>
{
    UITableView *_tableView;
    NSMutableArray *_dataArr;
    //保存上面的数据源数组
    NSMutableArray *_saveArr;
    
    UISearchController *_searchController;
}
@property (nonatomic,strong)UISearchController *searchController;
@property(nonatomic,strong)UITableView *tableView;
@property(nonatomic,strong)NSMutableArray *dataArr;
@property(nonatomic,strong)NSMutableArray *saveArr;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self creatTableView];
    
    [self creatSearchController];
}
#pragma - 搜索
- (void)creatSearchController {
    //创建 搜索控制器 参数传nil 表示显示结果用 当前视图控制器
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    //设置代理
    self.searchController.delegate = self;//控制界面显示的代理
    //控制 searchBar中输入内容的时候更新 的代理
    self.searchController.searchResultsUpdater = self;
    //设置 是否有半透明效果
    //默认是yes 有半透明效果无法点击cell
    //只有设置为NO下面的TableView的cell 才能被选择
    self.searchController.dimsBackgroundDuringPresentation = YES;
    
    //把一个搜索控制的searchBar 设置为TableView的头视图
    self.tableView.tableHeaderView = self.searchController.searchBar;
    //自动调整大小 否则不显示
    [self.searchController.searchBar sizeToFit];

}
#pragma mark - 搜索协议UISearchResultsUpdating
//当searchBar中的内容 改变/更新的时候一直调用
//刚开的时候也会调用(searchBar成为第一响应者也会调用)
//点击 cancel 取消的下面方法也会调用(cancel 的时候会清空内容)
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    NSLog(@"searchBar更新内容");
    //通过输入的内容 去原数据中 找有没有匹配的 ，如果有匹配的更新dataArr
    //searchController.searchBar.text 搜索条的内容
    [self.dataArr removeAllObjects];
#if 0
    //检索 匹配的内容遍历数组
    for (NSString *str in self.saveArr) {
        NSRange range = [str rangeOfString:searchController.searchBar.text];
        if (range.location != NSNotFound) {
            [self.dataArr addObject:str];
        }
    }
#elif 0
    //方法2:可以通过谓词语法 检索
    //查找 是否
    //用谓词的指令
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains %@",self.searchController.searchBar.text];
    //[self.saveArr filteredArrayUsingPredicate:predicate]内部 遍历数组self.saveArr，根据谓词条件 检索 数组元素没有包含 搜索内容的 (self 在这里表示数组的元素)
    //最终根据条件 过滤出 一个新的数组
    self.dataArr.array = [self.saveArr filteredArrayUsingPredicate:predicate];
#else
    //方法3:
    self.dataArr.array = [self.saveArr filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        //没有用谓词 指令条件
        //自己定义一个谓词搜索条件
        // 需要检索的对象evaluatedObject
        NSString *str = evaluatedObject;
        NSRange range = [str rangeOfString:self.searchController.searchBar.text];
        if (range.location != NSNotFound) {
            return YES;
        }else{
            return NO;
        }
    }]];
    
    
#endif
    //刷新表格
    [self.tableView reloadData];
}
#pragma mark - 搜索控制器界面显示的一些方法
#pragma mark UISearchControllerDelegate
- (void)willPresentSearchController:(UISearchController *)searchController {
    NSLog(@"搜索控制器将要显示");
}
- (void)didPresentSearchController:(UISearchController *)searchController {
    NSLog(@"搜索控制器 已经 显示");
}
- (void)willDismissSearchController:(UISearchController *)searchController {
    NSLog(@"搜索控制器 将要 消失");
}

- (void)didDismissSearchController:(UISearchController *)searchController {
    NSLog(@"搜索控制器 已经 消失");
    /*
     当点击cancel 先调用 1.将要消失 再调用updateSearchResultsForSearchController 3最后已经消失
     */
    //搜索视图控制器已经消失的时候再还原，
    //还原 数据源数组原来的数据
    [self.dataArr setArray:self.saveArr];
    //刷新表格
    [self.tableView reloadData];
}


#pragma mark - 表格视图
- (void)creatTableView {
    self.dataArr = [[NSMutableArray alloc] initWithObjects:@"xiaohong",@"xiaohuang",@"xiaoming",@"xiaofen",@"oudi",@"千锋",@"教育学院",@"经五路", nil];
    
    //保存数据源数组原数据---》搜索的过程中要改变数据源数组
    self.saveArr = [NSMutableArray arrayWithArray:self.dataArr];
    
    
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    [self.view addSubview:self.tableView];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = self.dataArr[indexPath.row];
    return cell;
}
//cell被选中
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *str = self.dataArr[indexPath.row];
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"hello" message:str preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        NSLog(@"ok");
    }]];
    //要用模态跳转
    //UIViewController *vc = self
    NSLog(@"%@",self.presentedViewController);//获取当前视图控制器已经presented 出得子视图控制器
    //模态跳转返回之后self.presentedViewController会改为nil
    
    UIViewController *vc = nil;
    if (self.presentedViewController) {
        vc = self.searchController;
    }else{
        vc = self;
    }
    //被presented出来在上面，如果self.searchController搜索时被弹出来，那么这是 选中cell 的时候应该由self.searchController把警告框模态弹出

    [vc  presentViewController:alert animated:YES completion:nil];
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
